package org.jeecg.common.util;

import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.UrlResource;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * PDF工具类
 */
@Slf4j
public class PDFutils {

    public static void main(String[] args) throws Exception{

        Map<String, Object> data = new HashMap<String, Object>();
        data.put("companyName", "河南云核算科技有限公司");
        data.put("companyCode", "8516ASD56316853ASD");
        data.put("name", "李四5");
        data.put("idCard", "436201251478541256");
        data.put("signService", "外包服务、技术服务");
        data.put("businessName", "杭州雷雷网络科技公司");
        data.put("signDate", "2023-03-08");
        String img = "https://img.yunshuijiang.com/miniofile/uploadImg/member/sign/1668480780508078082/tmp_d8dbd2c510c8621513daa2dce2b2b679_1687775887137.png";
        String image = img;
        if (img.indexOf("http://") != -1) {
            System.out.println("这里执行了");
            image = "https://" + img.split("http://")[1];
        }
        System.out.println(image);
        data.put("signName_af_image", image);
        System.out.println(pdfDataPaddingSign(data,"E:\\data\\2.pdf","2.pdf"));
    }

    /**
     * PDF数据填充（签约）
     * @param data
     *     companyName： 服务公司
     *     companyCode： 服务公司信用代码
     *     name： 乙方姓名
     *     idCard： 身份证号码
     *     signService： 签约服务类型
     *     businessName： 签约商户
     *     signDate： 签约日期
     *     signName_af_image：签字图片
     * @param savePath 文件保存路径
     * @param fileName 文件名称
     */
    public static boolean pdfDataPaddingSign(Map<String, Object> data,String savePath,String fileName){
        OutputStream os = null;
        PdfStamper ps = null;
        PdfReader reader = null;
        try {
            //判断文件是否存在，存在则先删除
            File file = new File(savePath);
            if(file.exists()){
                file.delete();
            }else {
                //判断文件夹是否存在，不存在则新建
                File folder = new File(savePath.split(fileName)[0]);
                if (!folder.exists() && !folder.isDirectory()) {
                    folder.mkdirs();
                }
            }
            os = new FileOutputStream(new File(savePath));
            // 1、通过文件输入流的方式读取文件
            ClassPathResource classPathResource = new ClassPathResource("/templates/自由职业者服务协议模板.pdf", PDFutils.class.getClassLoader());
            InputStream inputStream = classPathResource.getInputStream();
            // 2、读入pdf表单
            reader = new PdfReader(inputStream);
            // 3、根据表单生成一个新的pdf
            ps = new PdfStamper(reader, os);
            //限制复制和打印
            ps.setEncryption(null, null, ~(PdfWriter.ALLOW_COPY | PdfWriter.ALLOW_PRINTING), PdfWriter.STANDARD_ENCRYPTION_128);
            // 4、获取pdf表单
            AcroFields form = ps.getAcroFields();
            // 5、给表单添加中文字体 ---- 打包jar包运行会报错
//            ClassPathResource fontResource = new ClassPathResource("/font/FZLTHJW.TTF", PDFutils.class.getClassLoader());
//            BaseFont bf = BaseFont.createFont(fontResource.getPath(), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//            form.addSubstitutionFont(bf);
            // 6、文字类的内容处理：遍历data，给pdf表单表格赋值
            for (String key : data.keySet()) {
                form.setField(key, data.get(key).toString());
                // 7、图片类的内容处理
                if(key.endsWith("_af_image")){//是否以“_af_image”结尾，是则定义为图片数据
                    int pageNo = form.getFieldPositions(key).get(0).page;
                    Rectangle signRect = form.getFieldPositions(key).get(0).position;
                    float x = signRect.getLeft();
                    float y = signRect.getBottom();
                    //根据路径读取图片
                    Image image = Image.getInstance(data.get(key).toString());
                    //获取图片页面
                    PdfContentByte under = ps.getOverContent(pageNo);
                    //图片大小自适应
                    image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                    //添加图片
                    image.setAbsolutePosition(x, y);
                    under.addImage(image);
                }
            }
            ps.setFormFlattening(true);// 如果为false，生成的PDF文件可以编辑，如果为true，生成的PDF文件不可以编辑
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("PDF导出失败！ ===>:" + e.getMessage());
        } finally {
            try {
                ps.close();
                reader.close();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return false;
    }


}
